package ar.uba.fi.algo3.tests;

import junit.framework.TestCase;

import org.junit.Test;

import ar.uba.fi.algo3.auxiliares.*;
import ar.uba.fi.algo3.modelo.CampoBatalla;
import ar.uba.fi.algo3.modelo.astillero.*;
import ar.uba.fi.algo3.modelo.nave.Nave;

public class MovimientoBuqueTest extends TestCase {
		
	Astillero fabrica;
	CampoBatalla campoBatalla;
	Direccion direccion;
		
	public void setUp (){
		
			fabrica= new AstilleroDeBuques();	
			campoBatalla= new CampoBatalla();
	} 
	
	@Test
	public void testMoverBuqueALaDerecha (){
					
		Posicion unaPosicion= new Posicion(5,1);
		direccion= new DireccionDerecha();
		Nave unBuque= fabrica.crearNaveEn(unaPosicion, campoBatalla, direccion);
			
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),5);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),9);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),5);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
	}
	
	@Test
	public void testMoverBuqueALaIzquierda (){
		
		Posicion unaPosicion= new Posicion(1,1);
		direccion= new DireccionIzquierda();
		Nave unBuque= fabrica.crearNaveEn(unaPosicion, campoBatalla, direccion);
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),4);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),0);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),4);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
	}
	
	@Test
	public void testMoverBuqueHaciaArriba (){
		
		Posicion unaPosicion= new Posicion(1,1);
		direccion= new DireccionSuperior();
		Nave unBuque= fabrica.crearNaveEn(unaPosicion, campoBatalla, direccion);
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),4);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),0);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),0);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),0);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),4);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),0);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),4);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
	}
	
	@Test
	public void testMoverBuqueHaciaAbajo (){
		
		Posicion unaPosicion= new Posicion(5,8);
		direccion= new DireccionInferior();
		Nave unBuque= fabrica.crearNaveEn(unaPosicion, campoBatalla, direccion);
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),5);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),8);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),8);
		
		unBuque.moverNaves();		
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),5);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),9);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),9);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),9);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),9);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),5);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),8);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),8);
		
	}	
	
	@Test
	public void testMoverBuqueDiagonalDerechaSuperior (){
		
		Posicion unaPosicion= new Posicion(5,1);
		direccion= new DireccionDerechaSuperior();
		Nave unBuque= fabrica.crearNaveEn(unaPosicion, campoBatalla, direccion);
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),5);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),0);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),0);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),0);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),9);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),0);
	
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),5);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);			
	}
	
	@Test
	public void testMoverBuqueDerechaInferior (){
		
		Posicion unaPosicion= new Posicion(5,8);
		direccion= new DireccionDerechaInferior();
		Nave unBuque= fabrica.crearNaveEn(unaPosicion, campoBatalla, direccion);
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),5);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),8);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),8);
		
		unBuque.moverNaves();		
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),9);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),9);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),9);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),9);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),9);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),5);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),8);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),6);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),7);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),8);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),8);	
				
	}
	
	@Test
	public void testMoverBuqueDiagonalIzquierdaSuperior (){
		
		Posicion unaPosicion= new Posicion(1,1);
		direccion= new DireccionIzquierdaSuperior();
		Nave unBuque= fabrica.crearNaveEn(unaPosicion, campoBatalla, direccion);
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),4);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),0);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),0);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),0);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),0);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),0);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),1);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),1);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),4);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),1);
		
			
	}
	
	@Test
	public void testMoverBuqueIzquierdaInferior (){
		
		Posicion unaPosicion= new Posicion(1,8);
		direccion= new DireccionIzquierdaInferior();
		Nave unBuque= fabrica.crearNaveEn(unaPosicion, campoBatalla, direccion);
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),8);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),4);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),8);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),0);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),9);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),9);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),9);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),9);
		
		unBuque.moverNaves();
		
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getX(),1);
		assertEquals(unBuque.obtenerComponentes().get(0).getPosicion().getY(),8);
			
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getX(),2);
		assertEquals(unBuque.obtenerComponentes().get(1).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getX(),3);
		assertEquals(unBuque.obtenerComponentes().get(2).getPosicion().getY(),8);
		
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getX(),4);
		assertEquals(unBuque.obtenerComponentes().get(3).getPosicion().getY(),8);						
	}	
}

